Reinstate filtering for crossing events
authorMatthias Clasen <mclasen@redhat.com>
Sun, 16 Feb 2020 06:48:50 +0000 (01:48 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 21 Feb 2020 05:51:02 +0000 (00:51 -0500)
The event propagation limit should apply to crossing events
as well.

gtk/gtkeventcontroller.c
gtk/gtkeventcontrollerprivate.h

index 609c0bc774d8b19294e1f30cfa643f01ff63e9d3..16c5e0fc6ca7fe5fa674786ade2ddc609a355e63 100644 (file)
@@ -79,6 +79,22 @@ gtk_event_controller_unset_widget (GtkEventController *self)
   priv->widget = NULL;
 }
 
+static gboolean
+same_native (GtkWidget *widget,
+             GtkWidget *target)
+{
+  GtkWidget *native;
+  GtkWidget *native2;
+
+  if (!widget || !target)
+    return TRUE;
+
+  native = GTK_WIDGET (gtk_widget_get_native (widget));
+  native2 = GTK_WIDGET (gtk_widget_get_native (widget));
+
+  return native == native2;
+}
+
 static gboolean
 gtk_event_controller_filter_event_default (GtkEventController *self,
                                            const GdkEvent     *event)
@@ -90,28 +106,30 @@ gtk_event_controller_filter_event_default (GtkEventController *self,
 
   if (priv->limit == GTK_LIMIT_SAME_NATIVE)
     {
-      GtkWidget *native;
-      GtkWidget *native2;
-      GtkWidget *target;
+      if (same_native (priv->widget, GTK_WIDGET (gdk_event_get_target (event))) &&
+          same_native (priv->widget, GTK_WIDGET (gdk_event_get_related_target (event))))
+        return FALSE;
+
+      return TRUE;
+    }
 
-      native = GTK_WIDGET (gtk_widget_get_native (priv->widget));
+  return FALSE;
+}
 
-      target = GTK_WIDGET (gdk_event_get_target (event));
-      if (target)
-        {
-          native2 = GTK_WIDGET (gtk_widget_get_native (target));
-          if (native == native2)
-            return FALSE;
-        }
+static gboolean
+gtk_event_controller_filter_crossing_default (GtkEventController    *self,
+                                              const GtkCrossingData *crossing)
+{
+  GtkEventControllerPrivate *priv = gtk_event_controller_get_instance_private (self);
 
-      target = GTK_WIDGET (gdk_event_get_related_target (event));
+  if (priv->widget && !gtk_widget_is_sensitive (priv->widget))
+    return TRUE;
 
-      if (target)
-        {
-          native2 = GTK_WIDGET (gtk_widget_get_native (target));
-          if (native == native2)
-            return FALSE;
-        }
+  if (priv->limit == GTK_LIMIT_SAME_NATIVE)
+    {
+      if (same_native (priv->widget, crossing->old_target) &&
+          same_native (priv->widget, crossing->new_target))
+        return FALSE;
 
       return TRUE;
     }
@@ -212,6 +230,7 @@ gtk_event_controller_class_init (GtkEventControllerClass *klass)
   klass->set_widget = gtk_event_controller_set_widget;
   klass->unset_widget = gtk_event_controller_unset_widget;
   klass->filter_event = gtk_event_controller_filter_event_default;
+  klass->filter_crossing = gtk_event_controller_filter_crossing_default;
   klass->handle_event = gtk_event_controller_handle_event_default;
   klass->handle_crossing = gtk_event_controller_handle_crossing_default;
 
@@ -340,6 +359,9 @@ gtk_event_controller_handle_crossing (GtkEventController    *controller,
 
   controller_class = GTK_EVENT_CONTROLLER_GET_CLASS (controller);
 
+  if (controller_class->filter_crossing (controller, crossing))
+    return;
+
   g_object_ref (controller);
   controller_class->handle_crossing (controller, crossing, x, y);
   g_object_unref (controller);
index aed93f311a483d3bfd08bbea7ef550fa8c7dc6df..461b25dd7556b92586696502367143c1205a848f 100644 (file)
@@ -52,6 +52,10 @@ struct _GtkEventControllerClass
    */
   gboolean (* filter_event) (GtkEventController *controller,
                              const GdkEvent     *event);
+
+  gboolean (* filter_crossing) (GtkEventController    *controller,
+                                const GtkCrossingData *crossing);
+
   gpointer padding[10];
 };